// api/modules/index.ts - API模块入口文件
// 这个文件定义了仪表盘相关的API接口和数据类型，用于首页数据展示

// 导入配置好的axios实例：使用前面配置的api实例发送请求
import api from '@/api';
// 导入AxiosPromise类型：用于定义返回Promise的类型，确保类型安全
import type { AxiosPromise } from 'axios';

// 定义仪表盘账户信息接口（TypeScript类型定义）
// 接口描述了账户相关的数据类型和结构
export interface DashboardInfoAccountType {
  balance: string; // 账户余额：字符串类型，通常用于显示货币金额
  recharge_sum: string; // 充值总金额：已成功的充值总额
  recharge_count: number; // 充值次数：已成功的充值次数
  recharge_pending_sum: string; // 待处理充值金额：正在审核中的充值总额
  recharge_pending_count: number; // 待处理充值次数：正在审核中的充值次数
}

// 定义卡片状态统计接口
export interface DashboardCardStatusType {
  normal: number; // 正常卡片数量：状态正常的银行卡数量
  canceling: number; // 注销中卡片数量：正在注销流程中的卡片数量
  cancelled: number; // 已注销卡片数量：已经注销的卡片数量
  other: number; // 其他状态卡片数量：其他状态的卡片数量
}

// 定义卡片BIN信息接口
// BIN（Bank Identification Number）是银行卡的前6位数字，用于标识发卡行
export interface DashboardCardBinListType {
  cardbin: number; // 卡片BIN号：银行卡的前6位数字
  count: number; // 该BIN的卡片数量：拥有相同BIN的银行卡数量
  cardScheme: string; // 卡组织：如Visa、MasterCard、银联等
}

// 定义完整的仪表盘信息接口
export interface DashboardInfoType {
  account: DashboardInfoAccountType; // 账户信息：包含余额、充值等数据
  card: {
    card_count: number; // 卡片总数：用户拥有的所有银行卡数量
    card_status: DashboardCardStatusType; // 卡片状态统计：各种状态的卡片数量
    cardbin_list: Array<DashboardCardBinListType>; // BIN列表：按BIN分组的卡片信息
  };
}

// 定义资金趋势响应接口
export interface FinancialTrendsResponse {
  xdata: string[]; // X轴数据：通常是时间标签，如日期或月份
  ydata: Array<{ // Y轴数据数组：包含多条数据线
    i18n_key: string; // 国际化键：用于翻译数据线名称
    data: (string | number)[]; // 数据值数组：与xdata对应的数值
    color: string; // 颜色值：数据线在图表中显示的颜色
  }>;
}

// 首页仪表盘数据API：获取仪表盘所需的全部数据
// 返回AxiosPromise<DashboardInfoType>：一个Promise，解析后得到DashboardInfo类型的数据
export const getDashboardInfo = (): AxiosPromise<DashboardInfoType> => {
  // 使用api.get方法发送GET请求
  // 'api/dashboard'：请求的API端点路径
  // params：查询参数，_action='getData'表示获取仪表盘数据
  return api.get('api/dashboard', {
    params: {
      _action: 'getData', // 动作参数：告诉服务器要执行的操作
    },
  });
};

// 获取资金趋势数据API：获取资金流动的趋势图表数据
// type参数：指定时间范围类型，可以是'year'（年）、'month'（月）或'week'（周）
export const getFinancialTrends = (type: 'year' | 'month' | 'week'): AxiosPromise<FinancialTrendsResponse> => {
  // 发送GET请求到相同的API端点，但使用不同的_action参数
  return api.get('api/dashboard', {
    params: {
      _action: 'moneyTree', // 动作参数：获取资金趋势数据
      type, // 时间范围类型：年、月或周
    },
  });
};

// 默认导出：将所有API函数作为一个对象导出
// 这样其他文件可以通过import apiModules from '@/api/modules'来使用
// 然后通过apiModules.getDashboardInfo()等方式调用具体API
export default {
  getDashboardInfo,
  getFinancialTrends,
};